import pymongo
import os.path
import requests
import sys

# 屏蔽warning信息
requests.packages.urllib3.disable_warnings()


def getCourseName(name):
    patternName = {
        u'程序设计' : '程序设计基础C',
        u'综合英语' : '综合英语三',
        u'思想道德' : '思想道德与法律基础',
        u'算法设计' : '算法设计与分析',
        u'产品开发' : '产品开发管理',
        u'数字逻辑' : '数字逻辑'

    }
    for (k, v) in patternName.items():
        if k in name:
            return v
    return None


def download(url, file_path):
    # 第一次请求是为了得到文件总大小
    r1 = requests.get(url, stream=True, verify=False)
    total_size = int(r1.headers['Content-Length'])

    # 这重要了，先看看本地文件下载了多少
    if os.path.exists(file_path):
        temp_size = os.path.getsize(file_path)  # 本地已经下载的文件大小
    else:
        temp_size = 0

    if temp_size == total_size:
        return

    # 显示一下下载了多少
    print(temp_size)
    print(total_size)
    # 核心部分，这个是请求下载时，从本地文件已经下载过的后面下载
    headers = {'Range': 'bytes=%d-' % temp_size}
    # 重新请求网址，加入新的请求头的
    r = requests.get(url, stream=True, verify=False, headers=headers)

    # 下面写入文件也要注意，看到"ab"了吗？
    # "ab"表示追加形式写入文件
    with open(file_path, "ab") as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                temp_size += len(chunk)
                f.write(chunk)
                f.flush()

                ###这是下载实现进度显示####
                done = int(50 * temp_size / total_size)
                sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
                sys.stdout.flush()
    print()  # 避免上面\r 回车符


client = pymongo.MongoClient('mongo', 27017)
db = client['school']
cursor = db['school'].find({}, {"_id": 0}, no_cursor_timeout=True)
for course in cursor:
    courseName = getCourseName(course['names'])
    if not courseName:
        print("course " + course['names'] + 'not a dir')
        continue

    dirName = os.path.join('/course_media/', courseName)
    videoName = os.path.join('/course_media/', courseName, course['level'])
    if not os.path.exists(dirName):
        os.mkdir(dirName)

    realVideoName = videoName + '.mp4'
    download(course['url'], realVideoName)

cursor.close()




